# main.py
from publickey.math_utils import generate_large_prime, is_prime
from publickey.ecc_core import secp256k1_curve, generate_keypair, ecc_encrypt_simplified, ecc_decrypt_simplified

def run_ecc_demonstration():
    print("====== ECC 算法演示 ======")
    
    # 使用预定义的 secp256k1 曲线
    curve = secp256k1_curve
    print(f"使用的椭圆曲线: y^2 = x^3 + {curve.a}x + {curve.b} (mod {hex(curve.p)})")
    print(f"基点 G: (X={hex(curve.G[0])}, Y={hex(curve.G[1])})")
    print(f"基点 G 的阶 n: {hex(curve.n)}")

    # 1. 密钥生成 (Alice)
    print("\n--- 1. Alice 生成密钥对 ---")
    alice_private_key, alice_public_key = generate_keypair(curve)
    print(f"  Alice的私钥 (整数 d_A): {alice_private_key}") # 实际不应打印私钥
    print(f"  Alice的公钥 (点 Q_A): \n    X={hex(alice_public_key[0])}\n    Y={hex(alice_public_key[1])}")

    # 密钥生成 (Bob)
    print("\n--- 2. Bob 生成密钥对 ---")
    bob_private_key, bob_public_key = generate_keypair(curve)
    print(f"  Bob的私钥 (整数 d_B): {bob_private_key}") # 实际不应打印私钥
    print(f"  Bob的公钥 (点 Q_B): \n    X={hex(bob_public_key[0])}\n    Y={hex(bob_public_key[1])}")

    # 3. 加密 (Alice 加密消息发送给 Bob)
    print("\n--- 3. Alice 加密消息发送给 Bob ---")
    message_str = "ECC is quite fascinating! This is a test message."
    message_bytes = message_str.encode('utf-8')
    print(f"  Alice的原始消息: '{message_str}'")
    
    # Alice 使用 Bob 的公钥加密
    R_point, ciphertext = ecc_encrypt_simplified(bob_public_key, curve, message_bytes)
    print(f"  加密操作:")
    print(f"    临时点 R (kG): \n      X={hex(R_point[0])}\n      Y={hex(R_point[1])}")
    print(f"    密文 (Ciphertext): {ciphertext.hex()}")

    # 4. 解密 (Bob 收到密文并解密)
    print("\n--- 4. Bob 解密来自 Alice 的消息 ---")
    # Bob 使用自己的私钥解密
    try:
        decrypted_message_bytes = ecc_decrypt_simplified(bob_private_key, curve, R_point, ciphertext)
        decrypted_message_str = decrypted_message_bytes.decode('utf-8')
        print(f"  Bob解密后的消息: '{decrypted_message_str}'")
        
        if decrypted_message_bytes == message_bytes:
            print("  状态: 解密成功!")
        else:
            print("  状态: 解密失败! 明文不匹配。")
            
    except Exception as e:
        print(f"  解密过程中发生错误: {e}")

def run_prime_generation_demo():
    print("\n====== 大素数生成演示 ======")
    # 为ECC生成一个256位素数 (F_p中的p)
    # 注意：secp256k1的p是固定的，这里只是演示如何生成一个类似大小的素数
    print("\n--- 演示生成ECC曲线可能使用的素数 (例如256位) ---")
    # prime_for_ecc_field = generate_large_prime(256) # 这会花一些时间
    # print(f"生成的一个256位素数 P: {prime_for_ecc_field}")
    # print(f"P 的十六进制表示: {hex(prime_for_ecc_field)}")
    # print(f"P 是素数吗 (Miller-Rabin复核): {is_prime(prime_for_ecc_field, k=20)}")
    print("注意: 为ECC生成256位素数的过程可能需要几秒到几十秒。为节省演示时间，此处跳过实际生成。")
    print(f"  (可取消 math_utils.py 或本文件中的注释来运行生成)")
    print(f"  例如，secp256k1曲线的p是固定的：{hex(secp256k1_curve.p)}")


    # 为RSA生成大素数（例如512位作为演示，2024位会非常慢）
    # RSA通常需要两个这样的大素数
    print("\n--- 演示生成RSA算法可能使用的素数 (例如512位) ---")
    # prime_for_rsa_1 = generate_large_prime(512) # 512位已经较快，2024位会非常慢
    # print(f"为RSA生成的一个512位素数 P1: {prime_for_rsa_1}")
    # print(f"P1 的十六进制表示: {hex(prime_for_rsa_1)}")
    # prime_for_rsa_2 = generate_large_prime(512)
    # print(f"为RSA生成的另一个512位素数 P2: {prime_for_rsa_2}")
    # print(f"P2 的十六进制表示: {hex(prime_for_rsa_2)}")
    # print(f"对于RSA的2048位模数N，通常需要两个1024位的素数。生成2024位的素数会非常耗时。")
    print("注意: 为RSA生成512位素数也需要一些时间，2024位素数则需要更长时间。为节省演示时间，此处跳过实际生成。")
    print("  (可取消 math_utils.py 或本文件中的注释来运行生成)")

if __name__ == "__main__":
    run_ecc_demonstration()
    run_prime_generation_demo()